package de.puc.defencetower.controller.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import de.puc.defencetower.model.Map;
import de.puc.defencetower.model.MapCell;
import de.puc.defencetower.model.Monster;

/**
 * Setzt die Monster in Bewegung
 * 
 * @author Chrisi
 * 
 */
public class MonsterController {

	private Map map;
	private Timer timer;

	public MonsterController(Timer timer, Map map) {
		this.timer = timer;
		this.map = map;
		setTimer();
	}

	private void setTimer() {
		// monsterMove
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				moveAllMonsters();
			}
		}, 0, GameController.MONSTER_MOVE_TIME);

	}
	
	public synchronized void moveAllMonsters() {
		List<Monster> monsters = map.getMonsters();
		// In der Schleife darf man nicht einfach Elemente entfernen.
		List<Monster> monstersToRemove = new ArrayList<Monster>();
		for (Monster monster : monsters) {
			MapCell currentMapCell = monster.getCurrentMapCell();
			
			MapCell nextMapCell = map.getNextStreetCell(currentMapCell);
			
			// Monster ist auf Exit. Dann wieder auf Start setzen
			if(map.getExitMapCell().equals(currentMapCell)){
				// leben abziehen
				map.deductLive(1);
				// monster wieder auf start setzen
				nextMapCell = map.getSpawnMapCell();
			}
			
			if(nextMapCell != null){
				if (monster.isAlive()) {
					map.moveMonster(monster, nextMapCell);
				} else {
					monstersToRemove.add(monster);
				}
			}
		}
		for (Monster mr : monstersToRemove) {
			map.removeDeadMonster(mr);
		}
	}

}
